package com.luoshizhen.lease.web.app.controller.agreement;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.luoshizhen.lease.common.login.LoginUserHolder;
import com.luoshizhen.lease.common.result.Result;
import com.luoshizhen.lease.model.entity.LeaseAgreement;
import com.luoshizhen.lease.model.enums.LeaseStatus;
import com.luoshizhen.lease.web.app.service.LeaseAgreementService;
import com.luoshizhen.lease.web.app.vo.agreement.AgreementDetailVo;
import com.luoshizhen.lease.web.app.vo.agreement.AgreementItemVo;
import com.luoshizhen.lease.web.app.vo.agreement.AgreementDetailVo;
import com.luoshizhen.lease.web.app.vo.agreement.AgreementItemVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/app/agreement")
@Tag(name = "租约信息")
public class LeaseAgreementController {

    @Autowired
    private LeaseAgreementService service;

    /**
     * 获取个人租约基本信息列表
     *
     * 该方法通过GET请求获取当前登录用户的所有租约基本信息列表
     * 使用了Operation注解来描述接口的操作摘要，便于文档生成和维护
     * 使用GetMapping注解来映射HTTP GET请求到这个处理方法
     *
     * @return 返回一个Result对象，其中包含了一个AgreementItemVo对象的列表
     * Result用于统一接口返回格式，处理成功和失败的情况
     * AgreementItemVo是租约基本信息的视图对象，用于展示租约的必要信息
     */
    @GetMapping("listItem")
    public Result<List<AgreementItemVo>> listItem() {
        // 调用服务层方法，根据登录用户的电话号码获取租约列表
        List<AgreementItemVo> result = service.listItemByPhone(LoginUserHolder.getLoginUser().getUsername());
        // 返回成功结果，包含租约列表
        return Result.ok(result);
    }

    /**
     * 根据ID获取租约详细信息
     *
     * 此方法通过GET请求接收一个Long类型的id参数，并返回相应的租约详细信息
     * 主要用于前端在界面上展示特定租约的详细情况
     *
     * @param id 租约的唯一标识符，用于查询数据库中对应的租约详情
     * @return 返回一个Result对象，其中包含查询到的AgreementDetailVo对象，表示租约的详细信息
     */
    @Operation(summary = "根据id获取租约详细信息")
    @GetMapping("getDetailById")
    public Result<AgreementDetailVo> getDetailById(@RequestParam Long id) {
        AgreementDetailVo agreementDetailVo = service.getDetailById(id);
        return Result.ok(agreementDetailVo);
    }

    /**
     * 更新租约状态
     *
     * 根据提供的租约ID和新的租约状态，更新数据库中相应租约的状态信息
     * 此方法主要用于确认租约和处理提前退租的情况
     *
     * @param id 租约的唯一标识符，用于定位要更新的租约记录
     * @param leaseStatus 新的租约状态，用于更新租约记录的状态字段
     * @return 返回更新操作的结果，表明更新是否成功
     */
    @Operation(summary = "根据id更新租约状态", description = "用于确认租约和提前退租")
    @PostMapping("updateStatusById")
    public Result updateStatusById(@RequestParam Long id, @RequestParam LeaseStatus leaseStatus) {
        // 创建更新条件构造器
        LambdaUpdateWrapper<LeaseAgreement> updateWrapper = new LambdaUpdateWrapper<>();
        // 设置更新条件为根据ID匹配租约记录
        updateWrapper.eq(LeaseAgreement::getId, id);
        // 设置要更新的字段值为新的租约状态
        updateWrapper.set(LeaseAgreement::getStatus, leaseStatus);
        // 执行更新操作
        service.update(updateWrapper);
        // 返回操作成功的结果
        return Result.ok();
    }

    /**
     * 保存或更新租约信息
     * 该接口用于处理租约的续约操作，通过接收租约协议对象来更新或保存租约信息
     *
     * @param leaseAgreement 租约协议对象，包含需要更新或保存的租约信息
     * @return 返回操作结果，通常为操作成功或失败的信息
     */
    @Operation(summary = "保存或更新租约", description = "用于续约")
    @PostMapping("saveOrUpdate")
    public Result saveOrUpdate(@RequestBody LeaseAgreement leaseAgreement) {
        service.saveOrUpdate(leaseAgreement);
        return Result.ok();
    }

}
